package com.suning.utils;

import org.dom4j.Element;
import org.dom4j.Node;

import java.lang.reflect.Field;
import java.text.SimpleDateFormat;

/**
 * 〈一句话功能简述〉<br>
 * 〈功能详细描述〉
 *
 * @author 16080951(林健)
 * @Copyright (c) 2016 苏宁软件技术有限公司 版权所有
 * @see [相关类/方法]（可选）
 * @since [产品 /模块版本] （可选）
 */
public class XmlUtils {

    /**
     * json 数据转换对象
     * <p>
     * 要转换的Element数据
     *
     * @param element the root elt
     * @param pojo    要转换的目标对象类型
     * @return 转换的目标对象 object
     * @throws Exception 转换失败
     */
    @SuppressWarnings("rawtypes")
    public static Object fromXmlToBean(Element element, Class pojo) throws Exception {
        // 首先得到pojo所定义的字段
        Field[] fields = pojo.getDeclaredFields();
        // 根据传入的Class动态生成pojo对象
        Object obj = pojo.newInstance();
        for (Field field : fields) {
            // 设置字段可访问（必须，否则报错）
            field.setAccessible(true);

            String fieldName = field.getName();
            String attrValue = element.attributeValue(fieldName);

            //因为querString没有，所以有可能报异常。
            if ("queryString".equals(fieldName)) {
                StringBuilder stringBuilder = new StringBuilder();
                for (Node node : element.content()) {
                    stringBuilder.append(node.getStringValue());
                }
                field.set(obj, stringBuilder.toString());
                continue;
            }

            String attrName = element.attribute(fieldName).getName();
            if (fieldName.equals(attrName)) {
                // 根据字段的类型将值转化为相应的类型，并设置到生成的对象中。
                if (field.getType().equals(Long.class) || field.getType().equals(long.class)) {
                    field.set(obj, Long.parseLong(attrValue));
                } else if (field.getType().equals(String.class)) {
                    field.set(obj, attrValue);
                } else if (field.getType().equals(Double.class) || field.getType().equals(double.class)) {
                    field.set(obj, Double.parseDouble(attrValue));
                } else if (field.getType().equals(Integer.class) || field.getType().equals(int.class)) {
                    field.set(obj, Integer.parseInt(attrValue));
                } else if (field.getType().equals(java.util.Date.class)) {
                    field.set(obj, new SimpleDateFormat().parse(attrValue));
                } else {
                    continue;
                }
            }
        }
        return obj;
    }
}

